package io.union_pay.params.unified;

import io.union_pay.params.Goods;
import io.union_pay.params.UnionPayBaseParams;
import lombok.Data;

import java.util.List;

@Data
public class UnifiedOrderParams extends UnionPayBaseParams {

    private String openid;

    /**
     * 商户订单号
     * 是否必传：是
     */
    private String merOrderId;


    /**
     * 商品
     * 是否必传：否
     */
    private List<Goods> goods;

    /**
     * 商户附加数据
     * <= 255
     * 是否必传：否
     */
    private String attachedData;


    /**
     * 订单过期时间
     * yyyy-MM- dd HH:mm:ss
     * 是否必传：否
     */
    private String expireTime;

    /**
     * 用于优惠活动
     * 是否必传：否
     */
    private String goodsTag;

    /**
     * 商品交易单号
     * 跟 goods 二选一
     * 是否必传：否
     */
    private String goodsTradeNo;


    /**
     * 账单描述
     * <= 255
     * 微信 <= 128
     * 是否必传：否
     */
    private String orderDesc;


    /**
     * 原始总金额
     * 单位：分
     * 是否必传：否
     */
    private Integer originalAmount;

    /**
     * 商品id
     *
     * 是否必传：否
     */
    private String productId;

    /**
     * 支付总金额
     * 若divisionFlag为 true，
     * 则totalAmount
     *   =subOrders字段中的所有totalAmount值之和+platformAmount值
     *   =goods中的所有subOrderAmount值之和。
     *
     * 是否必传：否
     */
    private Integer totalAmount;

    /**
     * 分账标记
     * 若为true，
     * 则goods字段和subOrders字段不能同时为空；
     * 且secureTransaction字段上送false或不 上送。
     *
     * 是否必传：否
     */
    private Boolean divisionFlag;

    /**
     * 异步分账标记
     * 若为true，则goods字段和subOrders字段不能同时为空；
     * 且 secureTransaction字段上送false或不上送。
     * 退货订单不允许做子订单操作已确认的子订单，不允许隔天再确认
     *
     * 是否必传：否
     */
    private Boolean asynDivisionFlag;


    /**
     * 平台商户分账金额
     * 若分账标记传，则分账金额必传
     *
     * 是否必传：否
     */
    private Integer platformAmount;

    /**
     * 子订单信息
     * 是否必传：否
     */
    private List<UnifiedSubOrder> subOrders;

    /**
     * 支付结果通 知地址
     * <= 255
     *
     * 是否必传：否
     */
    private String notifyUrl;


    /**
     * 网页跳转地址
     * <= 255
     *
     * 是否必传：否
     */
    private String returnUrl;


    /**
     * 订单展示页
     * <= 255
     *
     * 是否必传：否
     */
    private String showUrl;


    /**
     * 担保交易标识
     * 取值：true或 false，默认false
     * 若上送为true，则交易的金额将会被暂缓 结算。
     * 调用担保完成接口后，完成部分金额会 在t+1日结算给商 户，剩余部分金额退 还用户。
     * 调用担保撤销接口，则全部资金退还给用 户。
     * 30天后没有主动调用 担保完成且没有主动调用担保撤销的交易将会自动按撤销 处理。
     *
     * 是否必传：否
     */
    private Boolean secureTransaction;


    /**
     * 微信子商户appId
     * <= 32
     *
     * 是否必传：是
     */
    private String subAppId;

    /**
     * 用户子标识
     *
     * 是否必传：是
     */
    private String subOpenId;

    /**
     * 用户子标识
     *
     * 是否必传：是
     */
    private String userId;

    /**
     * 交易类型
     *
     * 是否必传：是
     */
    private final String tradeType = "MINI";

    /**
     * 是否需要限制信用卡支付
     * 取值：true或false，默认false
     *
     * 是否必传：否
     */
    private Boolean limitCreditCard;


    /**
     * 花呗分期数
     * 取值：仅支持3、6、12
     *
     * 是否必传：否
     */
    private Integer installmentNumber;

    /**
     * 实名认证姓名
     * <= 32
     * Base64编码
     *
     * 是否必传：否
     */
    private String name;

    /**
     * 实名认证手机号
     * <= 20
     * Base64编码
     *
     * 是否必传：否
     */
    private String mobile;

    /**
     * 实名认证证件类型
     * 证件类型，微信支持 身份证、支付宝支持
     * 身份证：IDENTITY_CARD、
     * 护照：PASSPORT、
     * 军官证：OFFICER_CARD、
     * 士兵证： SOLDIER_CARD、
     * 户口本：HOKOU
     *
     * 是否必传：否
     */
    private String certType;

    /**
     * 实名认证证件号
     * <= 64
     * Base64编码
     *
     * 是否必传：否
     */
    private String certNo;

    /**
     * 是否需要实名认证
     * 需要实名认证时置为T
     *
     * 是否必传：否
     */
    private String fixBuyer;


    /**
     * 返佣字段
     * 目前支持支付宝渠道
     *
     * 是否必传：否
     */
    private RetCommParams retCommParams;

    /**
     * 手续费比例
     * 新悦融益业务 该字段必传
     *
     * 是否必传：否
     */
    private String feeRatio;

    /**
     * 确认成本补贴
     * 新悦融益业务该字段必传；是否成本补贴，true为不判断手续费比例, false按正常判断，默认false
     */
    private String costSubsidy;

    /**
     * 预授权交易标识
     * 取值：true或false，默认false。
     * 若上送为true，则交易的金额 将会被银行冻结。
     * 调用预授权完成接口后，完成部分金额会在t+1日结算给商户，剩余部分金额在 用户银行卡中解冻。（仅云闪付小程序支 持）
     */
    private Boolean preauthTransaction;
}
